// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GFX_ANDROID_SHARED_DEVICE_DISPLAY_INFO_H_
#define UI_GFX_ANDROID_SHARED_DEVICE_DISPLAY_INFO_H_

#include "base/android/scoped_java_ref.h"
#include "base/macros.h"
#include "base/memory/singleton.h"
#include "base/synchronization/lock.h"

namespace gfx {

// Facilitates access to device information typically only
// available using the Android SDK, including Display properties.
class SharedDeviceDisplayInfo {
public:
    static SharedDeviceDisplayInfo* GetInstance();

    // See documentation in DeviceDisplayInfo.java
    int GetDisplayHeight();
    int GetDisplayWidth();
    int GetPhysicalDisplayHeight();
    int GetPhysicalDisplayWidth();
    int GetBitsPerPixel();
    int GetBitsPerComponent();
    double GetDIPScale();
    int GetSmallestDIPWidth();
    int GetRotationDegrees();

    // Registers methods with JNI and returns true if succeeded.
    static bool RegisterSharedDeviceDisplayInfo(JNIEnv* env);

    void InvokeUpdate(JNIEnv* env,
        jobject jobj,
        jint display_height,
        jint display_width,
        jint physical_display_height,
        jint physical_display_width,
        jint bits_per_pixel,
        jint bits_per_component,
        jdouble dip_scale,
        jint smallest_dip_width,
        jint rotation_degrees);

private:
    friend struct base::DefaultSingletonTraits<SharedDeviceDisplayInfo>;

    SharedDeviceDisplayInfo();
    ~SharedDeviceDisplayInfo();
    void UpdateDisplayInfo(JNIEnv* env,
        jobject jobj,
        jint display_height,
        jint display_width,
        jint physical_display_height,
        jint physical_display_width,
        jint bits_per_pixel,
        jint bits_per_component,
        jdouble dip_scale,
        jint smallest_dip_width,
        jint rotation_degrees);

    base::Lock lock_;
    base::android::ScopedJavaGlobalRef<jobject> j_device_info_;

    int display_height_;
    int display_width_;
    int physical_display_height_;
    int physical_display_width_;
    int bits_per_pixel_;
    int bits_per_component_;
    double dip_scale_;
    int smallest_dip_width_;
    int rotation_degrees_;

    DISALLOW_COPY_AND_ASSIGN(SharedDeviceDisplayInfo);
};

} // namespace gfx

#endif // UI_GFX_ANDROID_SHARED_DEVICE_DISPLAY_INFO_H_
